﻿#include "RpcDataStream.h"

namespace XyNet
{
	const int RpcDataStream::_headSize = sizeof(int);	// 最大支持2G字节

	RpcDataStream::RpcDataStream(void) : _data(_headSize, '\0') {}

	RpcDataStream::RpcDataStream(const Bytes& body)
	{
		setBody(body);
	}

	void RpcDataStream::clear()
	{
		_data.assign(_headSize, '\0');
	}

	void RpcDataStream::swap(RpcDataStream& stream)
	{
		_data.swap(stream._data);
	}

	const byte* RpcDataStream::getData() const
	{
		return (const byte*)_data.data();
	}

	int RpcDataStream::getDataSize() const
	{
		return numeric_cast<int>(_data.size());
	}

	const byte* RpcDataStream::getHead() const
	{
		return (const byte*)_data.data();
	}

	byte* RpcDataStream::getHeadPtr()
	{
		return (byte*)_data.data();
	}

	int RpcDataStream::getHeadSize() const
	{
		return _headSize;
	}

	const byte* RpcDataStream::getBody() const
	{
		return (const byte*)_data.data() + _headSize;
	}

	byte* RpcDataStream::getBodyPtr()
	{
		return (byte*)_data.data() + _headSize;
	}

	int RpcDataStream::getBodySize() const
	{
		return numeric_cast<int>(_data.size()) - _headSize;
	}

	void RpcDataStream::setBody(const Bytes& body)
	{
		Bytes header(_headSize, '\0');
		int bodySize = numeric_cast<int>(body.size());
		memcpy((void*)header.data(), &bodySize, _headSize);	// 只有memcpy能正确设置大小
		_data = header + body;
	}

	bool RpcDataStream::allocateBodyByHead()
	{
		int size;
		memcpy((void*)&size, _data.data(), _headSize);	// 只有memcpy能正确获取大小
		if (size > 0)
		{
			_data.resize(_headSize + size, '\0');
			return true;
		}
		else
		{
			_data.resize(_headSize, '\0');
			return false;
		}
	}
}